package com.rd.sys.common.utils;

import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;

import baseproj.common.constants.BaseEnum;
import baseproj.common.constants.EnumUtil;

public class EnumChoiceUtil extends EnumUtil {

    private static final String ALL = "--所有--";

    /**
     * 通过该方法除掉指定code的枚举选项(包含all)
     * 
     * @param enumValues
     *            枚举对象数组
     * @param isAll
     *            是否包含"--ALL--",true包含，false不包含
     * @param code
     *            需过滤掉的枚举代码
     * @return 过滤后的map
     */
    public static Map<String, String> getPartValues(Object[] enumValues, boolean isAll, String code) {
        Map<String, String> nameMap = new LinkedHashMap<String, String>();

        if (isAll) {
            nameMap.put("", ALL);
        }

        for (Object obj : enumValues) {
            BaseEnum beObj = (BaseEnum) obj;
            // 只向map中添加除指定code外的枚举对象
            if (beObj.getCode().equals(code)) {
                continue;
            }
            nameMap.put(beObj.getCode(), beObj.getName());
        }

        return nameMap;
    }

    /**
     * 通过该方法除掉指定code的枚举选项(不包含all)
     * 
     * @param enumValues
     *            枚举对象数组
     * @param code
     *            需过滤掉的枚举代码
     * @return 过滤后的map
     */
    public static Map<String, String> getPartValues(Object[] enumValues, String code) {
        return getPartValues(enumValues, false, code);
    }

    /**
     * 通过该方法过滤多个指定的codes选项(包含all)
     * 
     * @param enumValues
     *            枚举对象数组
     * @param isAll
     *            是否包含"--ALL--",true包含，false不包含
     * @param codes
     *            需过滤掉的枚举数组代码
     * @return 过滤后的map
     */
    public static Map<String, String> getPartValues(Object[] enumValues, boolean isAll, String... codes) {
        Map<String, String> nameMap = new LinkedHashMap<String, String>();
        Set<String> codeSet = new HashSet<String>();

        for (String code : codes) {
            codeSet.add(code);
        }
        if (isAll) {
            nameMap.put("", ALL);
        }

        for (Object obj : enumValues) {
            BaseEnum beObj = (BaseEnum) obj;
            // 只向map中添加除指定code外的枚举对象
            if (codeSet.add(beObj.getCode())) {
                nameMap.put(beObj.getCode(), beObj.getName());
            }
        }

        return nameMap;
    }

    /**
     * 通过该方法过滤多个指定的codes选项(不包含all)
     * 
     * @param enumValues
     *            枚举对象数组
     * @param codes
     *            需过滤掉的枚举数组代码
     * @return 过滤后的map
     */
    public static Map<String, String> getPartValues(Object[] enumValues, String... codes) {
        return getPartValues(enumValues, false, codes);
    }

}
